#!/bin/bash

# 初始化统计变量
total_files=0
total_lines=0
total_comment_lines=0

# 递归遍历目录，处理指定扩展名的文件
count_lines() {
    local dir="$1"
    # 查找所有目标文件（.h, .hpp, .c, .cpp）
    while IFS= read -r file; do
        if [ -f "$file" ]; then
            ((total_files++))
            local in_comment_block=false
            local file_lines=0
            local file_comment_lines=0

            # 逐行分析文件
            while IFS= read -r line; do
                ((file_lines++))

                # 处理多行注释块
                if $in_comment_block; then
                    ((file_comment_lines++))
                    [[ "$line" == *"*/"* ]] && in_comment_block=false
                else
                    # 处理行内注释和行尾注释
                    if [[ "$line" == *"//"* || "$line" == *"/*"* ]]; then
                        ((file_comment_lines++))
                        # 如果是多行注释开始
                        if [[ "$line" == *"/*"* && "$line" != *"*/"* ]]; then
                            in_comment_block=true
                        fi
                    fi
                fi
            done < "$file"

            # 累加到全局统计
            total_lines=$((total_lines + file_lines))
            total_comment_lines=$((total_comment_lines + file_comment_lines))
        fi
    done < <(find "$dir" -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.c" -o -name "*.cpp" \))
}

# 主逻辑
if [ $# -eq 0 ]; then
    echo "用法: $0 <项目目录>"
    exit 1
fi

project_dir="$1"
if [ ! -d "$project_dir" ]; then
    echo "错误: 目录 $project_dir 不存在"
    exit 1
fi

count_lines "$project_dir"

# 输出结果
echo "===== 代码统计结果 ====="
echo "文件类型: .h, .hpp, .c, .cpp"
echo "总文件数: $total_files"
echo "总代码行数: $total_lines"
echo "总注释行数: $total_comment_lines"
echo "注释比例: $(echo "scale=2; $total_comment_lines * 100 / $total_lines" | bc)%"